#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//
//int main()
//{
//	// \? 在书写连续多个问好时使用，防止被解析成三字母词
//	// 尽管现在新的编译器避免了这个问题，但还是尽量使用转义字符
//	printf("Are you OK\?\?\?");
//
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	printf("%c\n", 'a');
//	printf("%c\n", '\''); // 转义单引号
//	printf("%s\n", "abcdef");
//	printf("%s\n", "abcdef");
//	printf("%s\n", "a");
//	printf("%s\n", "\""); // 转义双引号
//	printf("%c\n", '\\'); // 转义反斜杠
//	printf("abcdef\n");
//	printf("abc\bdef\n");
//
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	// 可以理解为字符的八进制或者十六进制的表示形式
//	printf("%c\n", '\130');
//	printf("%c\n", 'x30');
//
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//	printf("%zd\n", strlen("abc"));
//	printf("%zd\n", strlen("c:\test\130\test.c"));
//
//	return 0;
//}

// C语言是由一条又一条的语句构成的

//#include <stdio.h>
//
//int main()
//{
//	; // 空语句
//	3 + 4; // 表达式语句
//	printf("hehe\n"); // 函数调用语句
//	// 另外，代码块构成的就叫复合语句
//	// 控制语句，即顺序结构、选择结构、循环结构
//
//	return 0;
//}
// 注释会被替换为一个空格

//#include <stdbool.h>
//
//int main()
//{
//	/*_Bool flag = false;*/
//	bool flag = true;
//
//	if (flag)
//		printf("hehe\n");
//
//	return 0;
//}

// sizeof操作符号
// sizeof是一个关键字，也是操作符，专门是用来计算sizeof的操作符数的类型长度

//#include <stdio.h>
//
//int main()
//{
//	// sizeof运算符的返回值，C语言并无具体规定，留给系统自己去选择
//	// C语言提供了一个解决方法，创造了一个类型别名size_t，用来统一表示其返回值
//	// 打印的话用%zd来打印，size_t本质上是一种无符号整数
//	printf("%zd\n", sizeof(char));
//	printf("%zd\n", sizeof(_Bool));
//// sizeof类型要加括号，表达式可以不加
//
//	return 0;
//}

// bit - 比特
// Byte - 字节
// KB MB GB TB PB...
// 1Byte = 8bit 1KB = 1024Byte 1MB = 1024KB

//#include <stdio.h>
//
//int main()
//{
//	short s = 2; // s占2个字节
//	int b = 10;
//
//	// sizeof在代码进行编译的时候，就根据表达式的类型确定了，类型的常用
//	// 而表达式的执行却要在程序运行期间才能执行
//	// 在编译期间已经将sizeof处理掉了，所以在运行期间就不会执行表达式了
//	printf("zd\n", sizeof(s = b + 1)); // 里面的表达式会发生截断
//	printf("s = %d\n", s);
//
//	return 0;
//}

// 对于有符号数来说，最高位放1表示负数，放0表示正数
// char有可能是有符号的signed char，也可能是无符号的unsigned char
// 全局变量与局部变量
//#include <stdio.h>
//
//int a = 10;
//
//int main()
//{
//	{
//		int a = 20; // 局部变量
//		printf("%d\n", a);
//	}
//	printf("%d\n", a);
//
//	return 0;
//}

// C/C++语言中，要关注内存的三个区域：栈区，堆区，静态区
// 局部变量是放在内存的栈区
// 全局变量是放在内存的静态区
// 堆区是用来动态内存管理的

// 负数取模，结果的正负是由第一个运算数的正负号决定
//#include <stdio.h>
//
//int main()
//{
//	printf("%d\n", 11 % -5); // 1
//	printf("%d\n", -11 % -5); // -1
//	printf("%d\n", -11 % 5); // -1;
//
//	return 0;
//}

// 强制类型转换
//#include <stdio.h>
//
//int main()
//{
//	/*int a = 10;*/
//	int a = (int)3.14;
//	printf("%d\n", a);
//
//	return 0;
//}

// %e 表示使用科学计数法的浮点数，指数部分的e为小写
// %o表示八进制整数，%x表示十六进制整数
// 当然了，也包括%ld,llx等占位符

//#include <stdio.h>
//
//int main()
//{
//	// printf允许设置最小宽度
//	// 输出默认向右对齐
// // 最小宽度和小数位数这两个限定值，都可以用*代替，通过printf的参数传入
// // 输出部分字符串，可以用.[m]s指定输出的长度
//	printf("%5d\n", 123);
//	printf("%-5d\n", 123);
//	
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	int score = 0;
//	printf("请输入成绩：");
//
//	// 输入
//	scanf("%d", &score); // &取地址操作符
//	printf("%d\n", score);
//
//	return 0;
//}

// scanf()的返回值是一个整数，表示成功读取的变量个数
// scanf中的%s会自动跳过空白字符,将字符串读入数组的时候
// 不会检测字符串是否超过了数组长度，有越界的风险
// 因此在使用%s的时候，应该指定读入字符串的最长长度，写成%[m]s
//#include <stdio.h>
//
//int main()
//{
//	char name[11] = { 0 };
//	scanf("%5s", name);
//	printf("%s\n", name);
//
//	return 0;
//}

// 赋值忽略符
// 把*放在任何占位符的百分号后面，该占位符就不会返回值，解析后将被丢弃
//#include <stdio.h>
//
//int main()
//{
//	int year, month, day;
//
//	scanf("%d%*c%d%*c%d", &year, &month, &day);
//	printf("%d %d %d\n", year, month, day);
//
//	return 0;
//}





































